package com.ruoyi.system.service.impl;

import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.OmDuty;
import com.ruoyi.system.domain.OmDutyDept;
import com.ruoyi.system.domain.OmFile;
import com.ruoyi.system.domain.vo.UploadFile;
import com.ruoyi.system.mapper.OmDutyMapper;
import com.ruoyi.system.service.IOmDutyDeptService;
import com.ruoyi.system.service.IOmDutyService;
import com.ruoyi.system.service.IOmFileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 【请填写功能名称】Service业务层处理
 *
 * @author ruoyi
 * @date 2023-11-20
 */
@Service
public class OmDutyServiceImpl implements IOmDutyService {

    @Autowired
    private OmDutyMapper omDutyMapper;

    @Autowired
    private IOmFileService omFileService;

    @Autowired
    private IOmDutyDeptService iOmDutyDeptService;

    /**
     * 查询【请填写功能名称】
     *
     * @param id 【请填写功能名称】主键
     * @return 【请填写功能名称】
     */
    @Override
    public OmDuty selectOmDutyById(String id) {
        OmDuty omDuty = omDutyMapper.selectOmDutyById(id);
        OmDutyDept omDutyDept = new OmDutyDept();
        omDutyDept.setDutyId(Integer.valueOf(id));
        List<Integer> omDutyDepts = iOmDutyDeptService.selectOmDutyDeptList(omDutyDept).stream().map(v -> v.getDeptId()).collect(Collectors.toList());
        omDuty.setDeptIdList(omDutyDepts);
        // 查询文件
        OmFile omFile = new OmFile();
        omFile.setDutyId(Integer.valueOf(id));
        omFile.setFileType("duty");
        List<OmFile> omFiles = omFileService.selectOmFileList(omFile);
        List<UploadFile> uploadFiles = new ArrayList<>();
        omFiles.stream().forEach(v -> {
            UploadFile uploadFile = new UploadFile();
            uploadFile.setId(v.getId());
            uploadFile.setFileName(v.getFileName());
            uploadFile.setName(v.getFileName());
            uploadFile.setUrl(v.getFileUrl());
            uploadFiles.add(uploadFile);
        });
        omDuty.setFile(uploadFiles);
        return omDuty;
    }

    /**
     * 查询【请填写功能名称】列表
     *
     * @param omDuty 【请填写功能名称】
     * @return 【请填写功能名称】
     */
    @Override
    public List<OmDuty> selectOmDutyList(OmDuty omDuty) {
        return omDutyMapper.selectOmDutyList(omDuty);
    }

    @Override
    public List<OmDuty> selectOmDutyListTree(OmDuty omDuty) {
        boolean common = SecurityUtils.hasPermi("common");
        if (!common) {
            omDuty.setDeptId(Integer.parseInt(String.valueOf(SecurityUtils.getDeptId())));
        }
        List<OmDuty> omDuties = omDutyMapper.selectOmDutyList(omDuty);
        List<OmDuty> omDuties1 = selectOmDutyListStep(omDuties);
        return omDuties1;
    }

    // 递归
    public List<OmDuty> selectOmDutyListStep(List<OmDuty> omDuty) {
        for (int i = 0; i < omDuty.size(); i++) {
            OmDuty omDutyP = new OmDuty();
            OmDuty omDutyParent = omDuty.get(i);
            omDutyP.setParentId(omDutyParent.getId());
            List<OmDuty> omDuties = omDutyMapper.selectOmDutyList(omDutyP);
            if (!ObjectUtils.isEmpty(omDuties)) {
                omDutyParent.setChildren(omDuties);
                selectOmDutyListStep(omDuties);
            }
        }
        return omDuty;
    }


    /**
     * 新增【请填写功能名称】
     *
     * @param omDuty 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int insertOmDuty(OmDuty omDuty) {
        omDuty.setEnableMark("0");
        if (ObjectUtils.isEmpty(omDuty.getParentId())) {
            omDuty.setParentId(0);
        }
        Integer id = omDutyMapper.insertOmDuty(omDuty);
        if (!ObjectUtils.isEmpty(omDuty.getFile())) {
            setFile(omDuty.getFile(), omDuty.getId());
        }
        if (!ObjectUtils.isEmpty(omDuty.getDeptIdList())) {
            iOmDutyDeptService.deleteOmDutyDeptById(omDuty.getId());
            for (int i = 0; i < omDuty.getDeptIdList().size(); i++) {
                OmDutyDept omDutyDept = new OmDutyDept();
                omDutyDept.setDeptId(omDuty.getDeptIdList().get(i));
                omDutyDept.setDutyId(omDuty.getId());
                iOmDutyDeptService.insertOmDutyDept(omDutyDept);
            }
        }
        return id;
    }

    public void setFile(List<UploadFile> fileList, int id) {
        fileList.stream().forEach(v -> {
            OmFile omFile = new OmFile();
            omFile.setDutyId(id);
            omFile.setFileName(v.getFileName());
            omFile.setFileType("duty");
            omFile.setFileUrl(v.getUrl());
            omFileService.insertOmFile(omFile);
        });
    }

    /**
     * 修改【请填写功能名称】
     *
     * @param omDuty 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int updateOmDuty(OmDuty omDuty) {
        if ("1".equals(omDuty.getEnableMark())) {
            omDuty.setTrueComplete(new Date());
        }
        if (!ObjectUtils.isEmpty(omDuty.getDeptIdList())) {
            iOmDutyDeptService.deleteOmDutyDeptById(omDuty.getId());
            for (int i = 0; i < omDuty.getDeptIdList().size(); i++) {
                OmDutyDept omDutyDept = new OmDutyDept();
                omDutyDept.setDeptId(omDuty.getDeptIdList().get(i));
                omDutyDept.setDutyId(omDuty.getId());
                iOmDutyDeptService.insertOmDutyDept(omDutyDept);
            }
        }
        if (!ObjectUtils.isEmpty(omDuty.getFile())) {
            setFile(omDuty.getFile(), omDuty.getId());
        }
        return omDutyMapper.updateOmDuty(omDuty);
    }

    /**
     * 批量删除【请填写功能名称】
     *
     * @param ids 需要删除的【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteOmDutyByIds(String[] ids) {
        return omDutyMapper.deleteOmDutyByIds(ids);
    }

    /**
     * 删除【请填写功能名称】信息
     *
     * @param id 【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteOmDutyById(String id) {
        return omDutyMapper.deleteOmDutyById(id);
    }
}
